package com.itheima.case2.utils;

import java.util.HashMap;
import java.util.ResourceBundle;

public class BeansFactory {
    //多例工厂
    public static Object getBeans(String beanName) {
        Object obj = null;

        try {
            //加载配置文件，参数只需要给配置文件名即可
            ResourceBundle rb = ResourceBundle.getBundle("beans");
            //根据配置文件的key获取value即实现类全名 com.itheima.case2.service.impl.UserServiceImpl
            String classPath = rb.getString(beanName);
            //获取实现类的Class对象
            Class clazz = Class.forName(classPath);
            //创建实现类对象
            obj = clazz.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //返回bean对象
        return obj;






    }
    //定义map集合保存单例对象，保证只有一个map集合，所以定义到成员变量位置
    //Map集合的key是配置文件的等号内容userService，value存放的是等号右边内容com.itheima.case2.service.impl.UserServiceImpl
    private static HashMap<String,Object> beansMap = new HashMap<>();
    //定义方法提供单个对象，单例会有多线程安全问题，所以加同步

    public synchronized static <T>T getSingleBean(String beanName){
        //从map集合中根据key获取value，如果没有obj是null

        Object obj = beansMap.get(beanName);
        //判断map集合中是否含有数据
        if(obj==null){
            //第一次获取
            ResourceBundle resourceBundle = ResourceBundle.getBundle("beans");
            String classPath = resourceBundle.getString(beanName);

            //2.创建对象
            try {
                obj = Class.forName(classPath).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
            //将读取的内容放到map集合中
            beansMap.put(beanName,obj);
        }
        //返回单例对象
        return (T)obj;
    }
}